import re
from random import randint
from django.http import JsonResponse
from django.views import View
from django.shortcuts import HttpResponse
from django_redis import get_redis_connection

from celery_tasks.sms.tasks import celery_send_sms_code
from libs.captcha.captcha import captcha

"""
前端：    拼接出一个url。然后给img。 img会发起请求
         url= http://ip:port/image_codes/uuid/
后端：    
    请求      接收UUID
    业务逻辑   生成图片验证码和图片二进制。通过redis把图片验证码保存起来
    响应      返回图片二进制
    路由： GET  image_codes/uuid/
    步骤： 接受uuid——>生成图片验证码和图片二进制——>通过redis把图片验证码保存起来，返回图片验证码
"""

class ImageCodeView(View):
    def get(self, request, uuid):
        # 图片验证码内容 图片二进制
        text, image = captcha.generate_captcha()
        # 用redis保存图片验证码
        # 1. 连接redis
        redis_cli = get_redis_connection('code')

        # 2.操作指令
        redis_cli.setex(uuid, 100, text)

        # 返回二进制图片
        # 因为图片二进制我们不能返回json
        # content_type = 响应数据类型
        # content_type 的语法格式：   大类/小类
        # content_type(MIME类型)
        return HttpResponse(image, content_type='image/jpeg')

"""
前端： 
    当用户输入完手机号，图片验证码之后，前端发送axios请求
    sms_codes/18310820644/?image_code=knse&image_code_id=fffffff&
后端：
    请求：     接受请求，获取请求参数(路由有手机号，用户验证码和UUID在查询字符串中）
    业务逻辑：  验证参数，验证图片验证码，生成短信验证码 
    响应：     {'code':0, 'errmsg':'ok'}
    路由：     GET url = host+'/sms_codes/mobile+ '?image_code=image_code&image_code_id=image_code_id
    步骤：     
        1. 获取请求参数
        2. 验证参数
        3. 验证图片验证码
        4. 生成图片验证码
        5. 保存图片验证码
        6. 发送图片验证码
        7. 发送短信
"""
class SmsCodeView(View):
    def get(self, request, mobile):
        image_code = request.GET.get('image_code')
        uuid = request.GET.get('image_code_id')
        if not all([image_code, uuid]):
            return JsonResponse({'code': 400, 'errmsg': '参数不全'})
        image_code = image_code.lower()
        # 连接redis
        redis_cli = get_redis_connection('code')
        # 取出图片验证码
        redis_image_code = redis_cli.get(uuid).decode().lower()
        if redis_image_code is None:
            return JsonResponse({'code': 400, 'errmsg': '图片验证码已经过期'})
        if redis_image_code != image_code:
            return JsonResponse({'code': 400, 'errmsg': '图片验证码错误'})
        # 判断是否频繁发送短信
        if redis_cli.get('sent_flog_%s'%mobile):
            return JsonResponse({'code': 400, 'errmsg': '不要频繁发送短信'})
        # 生成验证码
        sms_code = '%06d'%randint(0, 999999)
        # 创建管道
        pipeline = redis_cli.pipeline()
        pipeline.setex(mobile, 60, sms_code)
        # 发送验证码
        # 放入消息队列
        print(f"验证码为：{sms_code}")
        # celery_send_sms_code.delay(mobile, sms_code)
        # 添加一个短信发送的标记
        pipeline.setex('sent_flog_%s'%mobile, 300, 1)
        pipeline.execute()
        return JsonResponse({'code': 0, 'errmsg': 'ok'})


